package io.jt808.proto.req;

import io.norland.buffer.AutoBuffer;
import io.norland.annotations.Proto;
import io.norland.proto.IProto;
import io.jt808.util.Tools;
import lombok.Data;

import java.util.Date;

/**
 * 驾驶员身份信息采集上报
 */
@Proto("0702")
@Data
public class JT0702 implements IProto {

    /**
     * 0x01：从业资格证 IC 卡插入（驾驶员上班）；
     * 0x02：从业资格证 IC 卡拔出（驾驶员下班）。
     */
    private byte status;
    /**
     * 时间
     */
    private Date time;
    /**
     * 读卡结果
     * 0x00：IC 卡读卡成功；
     * 0x01：读卡失败，原因为卡片密钥认证未通过；
     * 0x02：读卡失败，原因为卡片已被锁定；
     * 0x03：读卡失败，原因为卡片被拔出；
     * 0x04：读卡失败，原因为数据校验错误。
     * 以下字段在 IC 卡读取结果等于 0x00 时才有效
     */
    private byte readResult;

    /**
     * 驾驶员姓名长度
     */
    private short driverNameLength;

    /**
     * 驾驶员姓名
     */
    private String driverName;

    /**
     * 从业资格证编码 长度20
     */
    private String certificationCode;

    /**
     * 发证机构名称长度
     */
    private short licenseInstitutionNameLength;

    /**
     * 发证机构名称
     */
    private String licenseInstitutionName;

    /**
     * 证件有效期 YYYYMMDD
     */
    private Date expire;

    public final byte[] writeToBytes() {
        AutoBuffer buffer = new AutoBuffer();
        buffer.writeByte(status);
        buffer.writeBcdString(Tools.getBcdDateTime(time), 6);
        buffer.writeByte(driverNameLength);
        buffer.writeString(driverName, driverNameLength);
        buffer.writeString(certificationCode, 20);
        buffer.writeByte(licenseInstitutionNameLength);
        buffer.writeString(licenseInstitutionName, licenseInstitutionNameLength);
        buffer.writeBcdString(Tools.getBcdDate(expire), 4);
        return buffer.array();
    }

    public final void readFromBuf(AutoBuffer buffer) {
        status = buffer.readByte();
        time = Tools.getDateTime(buffer.readBcd(), buffer.readBcd(), buffer.readBcd(),
                buffer.readBcd(), buffer.readBcd(), buffer.readBcd());
        driverNameLength = buffer.readByte();
        driverName = buffer.readString(driverNameLength);
        certificationCode = buffer.readString(20);
        licenseInstitutionNameLength = buffer.readByte();
        licenseInstitutionName = buffer.readString(licenseInstitutionNameLength);
        expire = Tools.getDate(buffer.readBcd(),buffer.readBcd(), buffer.readBcd(), buffer.readBcd());
    }

//    public static void main(String[] args) {
//        byte[] bytes = new byte[]{
//                0x02,
//                0x18, 0x10, 0x26, 0x17, 0x15, 0x13,
//                0x04,
//                (byte) 0xC0, (byte) 0xBC, (byte) 0xB5, (byte) 0xC2,
//                0x34, 0x35, 0x34, 0x35, 0x34, 0x35, 0x34, 0x35, 0x34, 0x35,
//                0x34, 0x35, 0x34, 0x35, 0x34, 0x35, 0x34, 0x35, 0x34, 0x35,
//                0x04,
//                (byte) 0xC0, (byte) 0xBC, (byte) 0xB5, (byte) 0xC2,
//                0x20, 0x18, 0x10, 0x26
//        };
//        JT0702 jt8600 = new JT0702();
//        jt8600.readFromBuf(new AutoBuffer(bytes));
//        System.out.println(new String(bytes).equals(new String(jt8600.writeToBytes())));
//    }
}
